package IA.GA.editorial.domain;
import org.jgap.FitnessFunction;
import org.jgap.IChromosome;

import IA.GA.util.Helper;

public class BookFitnes extends FitnessFunction{
private double fitness;
private static double invalido=50;
private static double restriccion=25;
private static double reconpensa=25;

	public BookFitnes(Integer poblacionSize,Integer iteraciones) {		
	}

	@Override
	protected double evaluate(IChromosome chrome) {
	fitness = 850;
		//Olga recibe el ensayo
		if(Helper.instance.getGeneOlga(chrome).getTipoLibroGen().equals(TipoLibro.ENSAYO.getIndex()))			
			fitness += reconpensa;
		
		
		//El ensayo no esta en Ruso
		if(Helper.instance.getGeneOlga(chrome).getTipoLibroGen().equals(TipoLibro.ENSAYO) && Helper.instance.getGeneOlga(chrome).getIdiomaGen().equals(Idioma.RUSO))
			fitness -= restriccion;
		if(Helper.instance.getGeneSilvia(chrome).getTipoLibroGen().equals(TipoLibro.ENSAYO) && Helper.instance.getGeneSilvia(chrome).getIdiomaGen().equals(Idioma.RUSO))
			fitness -= restriccion;
		if(Helper.instance.getGeneJuan(chrome).getTipoLibroGen().equals(TipoLibro.ENSAYO) && Helper.instance.getGeneJuan(chrome).getIdiomaGen().equals(Idioma.RUSO))
			fitness -= restriccion;
		
						
		//Si el que tiene el libro en frances es mas corto que el que tiene Olga.
		if(Helper.instance.getGeneJuan(chrome).getIdiomaGen().equals(Idioma.FRANCES.getIndex()))
			if(Helper.instance.getGeneOlga(chrome).getLongitudGen()>Helper.instance.getGeneJuan(chrome).getLongitudGen())
				fitness += reconpensa;
		
		if(Helper.instance.getGeneSilvia(chrome).getIdiomaGen().equals(Idioma.FRANCES.getIndex()))
			if(Helper.instance.getGeneOlga(chrome).getLongitudGen()>Helper.instance.getGeneSilvia(chrome).getLongitudGen())
				fitness += reconpensa;
		
		//Si Siliva tradujo el de Ciencia Ficcion o el de 290 paginas.			
		if(Helper.instance.getGeneSilvia(chrome).getTipoLibroGen().equals(TipoLibro.CIENCIAFICCION.getIndex()))				
			fitness -= restriccion;
		
		if(Helper.instance.getGeneSilvia(chrome).getCantPaginasGen().equals(CantPaginas.CCXC.getIndex()))				
			fitness -= restriccion;
		
    //Si Juan tradujo el mas breve  
		if(Helper.instance.getGeneJuan(chrome).getLongitudGen().equals(Longitud.Breve.getIndex()))				
			fitness -= restriccion;
		
		//Si el que tiene el libro de Ciencia Ficcion tiene una longitud de 290 paginas
		if(Helper.instance.getGeneJuan(chrome).getTipoLibroGen().equals(TipoLibro.CIENCIAFICCION.getIndex()))
			if(Helper.instance.getGeneJuan(chrome).getCantPaginasGen().equals(CantPaginas.CCXC))
				fitness -= restriccion;
		
		if(Helper.instance.getGeneOlga(chrome).getTipoLibroGen().equals(TipoLibro.CIENCIAFICCION.getIndex()))
			if(Helper.instance.getGeneOlga(chrome).getCantPaginasGen().equals(CantPaginas.CCXC))
				fitness -= restriccion;
		
		if(Helper.instance.getGeneSilvia(chrome).getTipoLibroGen().equals(TipoLibro.CIENCIAFICCION.getIndex()))
			if(Helper.instance.getGeneSilvia(chrome).getCantPaginasGen().equals(CantPaginas.CCXC))
				fitness -= restriccion;
		
		//Si tiene el libro de ciencia ficcion y no tiene una longitud de 290 paginas
		if(Helper.instance.getGeneJuan(chrome).getTipoLibroGen().equals(TipoLibro.CIENCIAFICCION.getIndex()))
			if(!Helper.instance.getGeneJuan(chrome).getCantPaginasGen().equals(CantPaginas.CCXC))
				fitness += reconpensa;
		
		if(Helper.instance.getGeneOlga(chrome).getTipoLibroGen().equals(TipoLibro.CIENCIAFICCION.getIndex()))
			if(!Helper.instance.getGeneOlga(chrome).getCantPaginasGen().equals(CantPaginas.CCXC))
				fitness += reconpensa;
		
		if(Helper.instance.getGeneSilvia(chrome).getTipoLibroGen().equals(TipoLibro.CIENCIAFICCION.getIndex()))
			if(!Helper.instance.getGeneSilvia(chrome).getCantPaginasGen().equals(CantPaginas.CCXC))
				fitness += reconpensa;
				
		if(Helper.instance.getGeneJuan(chrome).getLongitudGen().equals(Longitud.Breve.getIndex()))				
			fitness -= restriccion;
		
		if(Helper.instance.getGeneJuan(chrome).getIdiomaGen().equals(Idioma.FRANCES.getIndex()))				
			fitness -= restriccion;
		
//		//Libro repetido
		if (Helper.instance.getGeneJuan(chrome).getTipoLibroGen().equals(Helper.instance.getGeneOlga(chrome).getTipoLibroGen()))
			fitness -= invalido;
		if (Helper.instance.getGeneJuan(chrome).getTipoLibroGen().equals(Helper.instance.getGeneSilvia(chrome).getTipoLibroGen()))
			fitness -= invalido;
		if (Helper.instance.getGeneOlga(chrome).getTipoLibroGen().equals(Helper.instance.getGeneSilvia(chrome).getTipoLibroGen())) 
			fitness -= invalido;

		// Idioma repetido
		if(    Helper.instance.getGeneJuan(chrome).getIdiomaGen().equals(Helper.instance.getGeneOlga(chrome).getIdiomaGen()    ))
			fitness -= invalido;
		if(Helper.instance.getGeneJuan(chrome).getIdiomaGen().equals(Helper.instance.getGeneSilvia(chrome).getIdiomaGen()  ))
			fitness -= invalido;
		if(Helper.instance.getGeneOlga(chrome).getIdiomaGen().equals(Helper.instance.getGeneSilvia(chrome).getIdiomaGen()) )
			fitness -= invalido;

		// Longitud repetida
		if(    Helper.instance.getGeneJuan(chrome).getLongitudGen().equals(Helper.instance.getGeneOlga(chrome).getLongitudGen()    ))
			fitness -= invalido;
		if(Helper.instance.getGeneJuan(chrome).getLongitudGen().equals(Helper.instance.getGeneSilvia(chrome).getLongitudGen()  ))
			fitness -= invalido;
		if(Helper.instance.getGeneOlga(chrome).getLongitudGen().equals(Helper.instance.getGeneSilvia(chrome).getLongitudGen()) )
			fitness -= invalido;
		 
//		  Dos libros con 290 páginas
		 if(  ( Helper.instance.getGeneSilvia(chrome).getCantPaginasGen().equals(CantPaginas.CCXC) &&
			        Helper.instance.getGeneJuan(chrome).getCantPaginasGen().equals(CantPaginas.CCXC)) )
			 fitness -= invalido;
		 
	     if ( Helper.instance.getGeneSilvia(chrome).getCantPaginasGen().equals(CantPaginas.CCXC) &&
			       Helper.instance.getGeneOlga(chrome).getCantPaginasGen().equals(CantPaginas.CCXC) )
	    	 fitness -= invalido;
	    
		 if	 ( Helper.instance.getGeneJuan(chrome).getCantPaginasGen().equals(CantPaginas.CCXC) &&
			       Helper.instance.getGeneOlga(chrome).getCantPaginasGen().equals(CantPaginas.CCXC) )
			 fitness -= invalido;
		 
		 //No hay alguno con 290 paginas
		 if(!Helper.instance.getGeneJuan(chrome).getCantPaginasGen().equals(CantPaginas.CCXC)    &&
			!Helper.instance.getGeneSilvia(chrome).getCantPaginasGen().equals(CantPaginas.CCXC)	&&
			!Helper.instance.getGeneOlga(chrome).getCantPaginasGen().equals(CantPaginas.CCXC))
			 fitness -= invalido;
		
		return fitness;
	}
	
}
